package hust.rpc.handler;

import hust.rpc.ProviderBootstrap;
import hust.rpc.constants.Constants;
import hust.rpc.invoker.RemoteInvoker;
import hust.rpc.pojo.RpcResponse;
import hust.rpc.proxy.Proxy;
import hust.rpc.service.ProviderService;
import hust.rpc.utils.SingletonUtils;
import hust.rpc.utils.ThreadUtils;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;

/**
 * 提供者 <-> 注册中心处理器
 */
@Slf4j
public class RegistryHandler extends RpcInvokeHandler {

    /**
     * channel通道活跃时(刚连接上注册中心)
     * 发送给注册中心提供者服务注册RPC请求
     *
     * @param ctx channel信息上下文
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 获取RemoteInvoker单例,并添加提供者信息(对于提供者来说,注册中心的注册服务是提供者服务)
        SingletonUtils.getInstance(RemoteInvoker.class).addProvider(hust.rpc.pojo.Channel.wrap(ctx.channel()), Collections.singletonList(Constants.PROVIDER_SERVICE));

        // 获取Proxy单例(AllProxy实现)
        Proxy proxy = SingletonUtils.getInstance(Proxy.class);
        // 获取ProviderService代理对象
        ProviderService service = proxy.getProxy(ProviderService.class);

        // 通过连接池发送注册RPC请求
        ThreadUtils.execute(() -> {
                    // 注册RPC请求
                    service.register(ProviderBootstrap.getHost(), proxy.getLocalServices());
                    // 闭锁打开,同步结束,监听本地端口
                    ProviderBootstrap.countDown();
                }
        );
        super.channelActive(ctx);
    }

    @Override
    protected void handleResponse(Channel channel, RpcResponse response) {
        log.info(response.toString());
        super.handleResponse(channel, response);
    }
}
